#include <iostream>
using namespace std;

class Object {
  int value;

 public:
  Object(int x) : value(x) {
    cout << this << "->Object(" << value << ")" << endl;
  }

  ~Object() { cout << this << "->~Object(" << value << ")" << endl; }

  Object(const Object& o) : value(o.value) {
    cout << this << "->Object(const Object& " << o.value << ")" << endl;
  }

  Object(Object&& o) : value(o.value) {
    cout << this << "->Object(Object&& " << o.value << ")" << endl;
  }

  Object& operator=(const Object& o) {
    value = o.value;
    cout << this << "->Object& operator(& " << &o << ")" << endl;
    return *this;
  }

  Object& operator=(Object&& o) {
    value = o.value;
    cout << this << "->Object& operator(&& " << &o << ")" << endl;
    return *this;
  }

  static Object make(int x) {
    Object t(x);
    return t;
  }
};

int main() {
  {
    auto a = Object(1);
  }
  {
    auto a = Object::make(2);
  }
  {
    auto a = Object(1);
    auto b(a);
  }
}